/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gui;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import comunicacao.Comunicacao;
import java.io.IOException;
import java.util.Vector;
import util.Constantes;
import jogo.JogoCliente;
import jogo.Jogador;
import jogo.Peca;

/**
 *
 * @author Pablo
 */
public class TelaJogo extends Canvas {

    private JogoCliente jogo;
    private Comunicacao comunicao;
    private boolean seletor_v;
    private int seletor_h;
    
    // Apager os parametros baixo
   // private int[] pecasJogadores;
    //private Jogador jogador;
    //private Vector pecasDireita;
   // private Vector pecasEsquerda;
    private boolean jogada = true;

    public TelaJogo(Comunicacao comunicacao, JogoCliente jogo) {
        this.seletor_h = 0;
        this.seletor_v = true;
        this.comunicao = comunicacao;
        this.jogo = jogo;
    }

    private int getSelecao() {
        return this.seletor_h;
    }

    private int getLado() {
        if (seletor_v) {
            return Constantes.LADO_ESQUERDO;
        } else {
            return Constantes.LADO_DIREITO;
        }
    }

    protected void keyPressed(int keycode) {
//        if (selecionada == null) {
//			selecionada = jogador.getComeco();
//		}
        switch (getGameAction(keycode)) {
            case Canvas.RIGHT:
            case Canvas.KEY_NUM6:
                if (seletor_h < this.jogo.getJogador().getPecas().size() - 1) {
                    seletor_h += 1;
                //selecionada = selecionada.getProxima();
                }
                break;
            case Canvas.LEFT:
            case Canvas.KEY_NUM4:
                if (seletor_h > 0) {
                    seletor_h -= 1;
                //selecionada = selecionada.getAnterior();
                }
                break;
            case Canvas.UP:
            case Canvas.KEY_NUM2:
                if (!seletor_v) {
                    seletor_v = true;
                //face = mesa.getComeco().getValor0();
                }
                break;
            case Canvas.DOWN:
            case Canvas.KEY_NUM8:
                if (seletor_v) {
                    seletor_v = false;
                //face = mesa.getFim().getValor1();
                }
                break;
            case Canvas.FIRE:
            case Canvas.KEY_NUM5:
//			if (!contagemPontos || !contagemPontos2) {
//				if (!alerta) {
                fazerJogada();
//				} else {
//					alerta = false;
//				}
//			}
        }
        repaint();
    // System.out.println("seletor_h = " + seletor_h);
    // System.out.println("pecas = " + jogador.getPecas());
    }

    private void fazerJogada() {
        if(this.jogo.podeJogarPeca(this.getSelecao(), this.getLado())){
            try {
                Vector dados = this.jogo.getPecaJogada(this.getSelecao(), this.getLado());
                this.comunicao.jogar(dados);
                if (seletor_h == this.jogo.getJogador().getPecas().size() - 1) {
                    this.seletor_h = seletor_h - 1;
                }

            } catch (IOException e) {
                    // OK
            }
        }
    }
        
        
        /*Vector pecasMesa = montarPecasMesa();
        System.out.println(pecasMesa.size());
        if (pecasMesa.size() == 0) {

            //pecasDireita.addElement(jogador.getPecas().elementAt(seletor_h));
            //pecasEsquerda.addElement(jogador.getPecas().elementAt(seletor_h));
            //jogador.getPecas().removeElementAt(seletor_h);
            seletor_h = 0;
//          toquei = false;
        } else {

            if (seletor_v) {
                //pecasEsquerda.addElement(jogador.getPecas().elementAt(seletor_h));
                //jogador.getPecas().removeElementAt(seletor_h);
                seletor_h = 0;
//		toquei = false;
            } else {
                //pecasDireita.addElement(jogador.getPecas().elementAt(seletor_h));
                //jogador.getPecas().removeElementAt(seletor_h);
                seletor_h = 0;
                seletor_v = true;
//					Peca temp = jogador.getComeco();
//					boolean tocou = true;
//					while (temp != null) {
//						tocou &= temp.getValor0() != mesa.getComeco()
//								.getValor0();
//						tocou &= temp.getValor0() != mesa.getFim().getValor1();
//						tocou &= temp.getValor1() != mesa.getComeco()
//								.getValor0();
//						tocou &= temp.getValor1() != mesa.getFim().getValor1();
//						temp = temp.getProxima();
//					}
//					if (tocou) {
//						alerta = true;
//						erro = "Voc� n�o possui pe�a para jogar!";
//
//						String msg = "TOQUEI";
//						vezDeJogar = false;
//						toquei = true;
//
//						if (server != null) {
//							Domino.sendData(server.output, msg);
//						} else {
//							Domino.sendData(client.output, msg);
//						}
//					} else {
//						alerta = true;
//						erro = "Jogoda n�o permitida!";
//					}
            }
        }
    }*/

    public void atualizarTelaJogada(Vector pecas) {
//        StringBuffer sb = new StringBuffer();
//        for (int i = 0; i < pecas.size(); i++) {
//            Peca p = (Peca) pecas.elementAt(i);
//            sb.append(p.toString());
//        }
//        txPecas.setString(sb.toString());
        jogada = true;
        repaint();
    }

    protected void paint(Graphics g) {
        // Desenhando a mesa fundo
        g.setColor(0, 128, 0);
        g.fillRect(0, 0, getWidth(), getHeight());
        desenhaJogo(g);

    }

    private void desenhaSeletorH(Graphics g, int top, int left) {
        g.setColor(255, 0, 0);
        g.drawRect(left + 12 * (seletor_h), top, 11, 22);
        g.drawRect(left + 12 * (seletor_h) - 1, top - 1, 13, 24);
    }

    private void desenhaSeletorV(Graphics g, int top, int left) {
        if (seletor_v) {
            g.setColor(255, 0, 0);
            g.drawRect(left, top, 11, 11);
            g.drawRect(left - 1, top - 1, 13, 13);
        } else {
            g.setColor(255, 0, 0);
            g.drawRect(left, top + 13, 11, 11);
            g.drawRect(left - 1, top + 13 - 1, 13, 13);
        }
    }

    private void desenhaJogo(Graphics g) {
        int colunas = 5;
        Vector pecasEsquerda = this.jogo.getPecasEsquerda();
        Vector pecasDireita = this.jogo.getPecasDireita();
        Jogador jogador = this.jogo.getJogador();

        Vector nomeJogadores = this.jogo.getNomeJogadores();

        int posicao = nomeJogadores.indexOf(jogador.getNome());

        g.setColor(255, 255, 255);
        int[] pontuacao = this.jogo.getPontuacao();
        if (posicao % 2 == 0) {
            g.drawString(pontuacao[0] + "x" + pontuacao[1], 210, 265, 0);
        } else {
            g.drawString(pontuacao[1] + "x" + pontuacao[0], 210, 265, 0);
        }
        g.setColor(0, 255, 0);

        //desenha Nome();

        if (nomeJogadores.size() == 4) {
            
            int p = (posicao + 1) % 4;
            
            while (p != posicao){

                String nomeJogador = (String) nomeJogadores.elementAt(p);
                desenharNome(g, nomeJogador, p, posicao);

                p = (p + 1) % 4;
            }
        } else {
            int posicaoVertical = 0;
            int posicaoHorizontal = 0;
            for (int a = 0; a < 4; a++) {

                String numeroPecas = "(" + this.jogo.getPecasJogadores()[a] + ")";

                if (a != posicao) {
                    if (a == this.jogo.getJogadorVez()) {
                        g.setColor(255,255,255);
                    } else {
                        g.setColor(0, 255, 0);
                    }
                    if (a == (posicao + 3) % 4) {
                        posicaoVertical = 60;
                        posicaoHorizontal = 5;
                        g.drawString(numeroPecas, posicaoHorizontal, posicaoVertical, 0);
                    } else if (a == (posicao + 1) % 4) {
                        posicaoVertical = 60;
                        posicaoHorizontal = 220;

                        g.drawString(numeroPecas, posicaoHorizontal, posicaoVertical, 0);
                    } else {
                        posicaoVertical = 5;
                        posicaoHorizontal = 80;
                        g.drawString(numeroPecas, posicaoHorizontal, posicaoVertical, 0);

                    }
                }
            }
        }
                
        int pecas = pecasDireita.size() + pecasEsquerda.size() - 1;
        if (jogador != null) {
            // Calculando a altura e largura do jogo na mesa
            if (pecas <= 5) {
                colunas = 1;
            } else if (pecas <= 11) {
                colunas = 2;
            } else if (pecas <= 16) {
                colunas = 3;
            } else if (pecas <= 22) {
                colunas = 4;
            }

            int largura_total = 24 * colunas;
            int altura_total = (pecas < 5) ? pecas * 24 : 120;
            int top = (250 - altura_total) / 2;
            int left = (getWidth() / 2) - (largura_total / 2);

            desenhaMao(g, 260, 40);

            // Mesa
            Vector pecasMesa = this.montarPecasMesa();


            boolean vertical = true;
            boolean up = false;

            for (int i = 0; i < pecasMesa.size(); i++) {
                Peca atual = (Peca) pecasMesa.elementAt(i);
                //System.out.println(atual.getValor1() + "/" + atual.getValor2());
                switch (i) {
                    case 5:
                    case 16:
                    case 27:
                        vertical = false;
                        up = true;
                        break;
                    case 10:
                    case 21:
                        vertical = false;
                        up = false;
                }
                if (vertical) {
                    // if (atual.equals(jogo.getComeco())) {
                    desenhaPeca(g, vertical, up, top, left, atual.getValor1(),
                            atual.getValor2());
                    // }
                    if (up) {
                        top -= 24;
                    } else {
                        top += 24;
                    }
                } else {
                    if (up) {
                        top -= 12;
                        left += 13;
                        // g.fillRect(left, top, 23, 11);
                        desenhaPeca(g, vertical, up, top, left, atual.getValor1(),
                                atual.getValor2());
                        top -= 24;
                        left += 11;
                    } else {
                        top += 11;
                        // g.fillRect(left, top, 23, 11);
                        desenhaPeca(g, vertical, up, top, left, atual.getValor1(),
                                atual.getValor2());
                        top += 1;
                        left += 24;
                    }
                    vertical = true;
                }

            }
        }

    }

    private void desenharNome(Graphics g, String nome, int posicao, int posicaoJogador) {

        if (posicao == this.jogo.getJogadorVez()) {
            g.setColor(255,255,255);
        } else {
            g.setColor(0, 255, 0);
        }

        String numeroPecas = "(" + this.jogo.getPecasJogadores()[posicao] + ")";

        int posicaoVertical = 0;
        int posicaoHorizontal = 0;
        if (posicao == (posicaoJogador + 3) % 4) {
            posicaoVertical = 60;
            posicaoHorizontal = 5;
            for (int j = 0; j < nome.length(); j++) {
                char letra = nome.charAt(j);
                g.drawChar(letra, posicaoHorizontal, posicaoVertical, 0);
                posicaoVertical = posicaoVertical + 10;
            }
            g.drawString(numeroPecas, posicaoHorizontal, posicaoVertical, 0);
        } else if (posicao == (posicaoJogador + 1) % 4) {
            posicaoVertical = 60;
            posicaoHorizontal = 220;
            for (int j = 0; j < nome.length(); j++) {
                char letra = nome.charAt(j);
                g.drawChar(letra, posicaoHorizontal, posicaoVertical, 0);
                posicaoVertical = posicaoVertical + 10;
            }
            g.drawString(numeroPecas, posicaoHorizontal, posicaoVertical, 0);
        } else {
            posicaoVertical = 5;
            posicaoHorizontal = 80;
            g.drawString(nome + " " + numeroPecas, posicaoHorizontal, posicaoVertical, 0);

        }

        g.setColor(0, 255, 0);

    }

    private Vector montarPecasMesa() {
        Vector pecasMesa = new Vector();
        //Peca primeiraPeca = (Peca) pecasDireita.firstElement();
        Vector pecasEsquerda = this.jogo.getPecasEsquerda();
        Vector pecasDireita = this.jogo.getPecasDireita();
        
        //System.out.println(pecasEsquerda.size());
        if (pecasEsquerda.size() != 0) {
            for (int i = (pecasEsquerda.size() - 1); i >= 0; i--) {
                Peca peca = (Peca) pecasEsquerda.elementAt(i);

                if (i != 0) {
                    Peca pecaAnterior = (Peca) pecasEsquerda.elementAt(i - 1);
                    if (peca.getValor2() != pecaAnterior.getValor1()) {
                        peca.trocarValores();
                    }
                }

                pecasMesa.addElement(peca);
            }

            for (int i = 1; i < pecasDireita.size(); i++) {
                Peca peca = (Peca) pecasDireita.elementAt(i);

                Peca pecaAnterior = (Peca) pecasDireita.elementAt(i - 1);

                if (peca.getValor1() != pecaAnterior.getValor2()) {
                    peca.trocarValores();
                }

                pecasMesa.addElement(peca);
            }
        }

        return pecasMesa;
    }

    private void desenhaMao(Graphics g, int top, int left) {
        Vector pecas = this.jogo.getJogador().getPecas();

        int i = 0;

        for (i = 0; i < pecas.size(); i++) {
            Peca atual = (Peca) pecas.elementAt(i);
            desenhaPeca(g, true, false, top, left, atual.getValor1(), atual.getValor2());
            left += 12;
        }

        if (jogada) {
            Vector pecasMesa = this.montarPecasMesa();
            if (pecasMesa.size() != 0) {
                desenhaSeletorH(g, top, left - 12 * i);
                g.setColor(255, 255, 255);
                g.drawString("Jogar em:", left, top, Graphics.TOP | Graphics.LEFT);
                desenhaFace(g, top, left + 50, ((Peca) pecasMesa.firstElement()).getValor1());
                desenhaFace(g, top + 13, left + 50, ((Peca) pecasMesa.lastElement()).getValor2());
                desenhaSeletorV(g, top, left + 50);
            } else {
                g.setColor(255, 255, 255);
                g.drawString("Iniciar com", left, top, Graphics.TOP | Graphics.LEFT);
                g.drawString("esta peça", left, top + 14, Graphics.TOP | Graphics.LEFT);
                desenhaSeletorH(g, top, left - 12 * i);
            }
        }
    }

    private void desenhaPeca(Graphics g, boolean vertical, boolean swap,
            int top, int left, int v0, int v1) {
        if (vertical && swap) {
            int temp = v0;
            v0 = v1;
            v1 = temp;
        }
        if (vertical) {
            desenhaFace(g, top, left, v0);
            desenhaFace(g, top + 11, left, v1);
        } else {
            desenhaFace(g, top, left, v0);
            desenhaFace(g, top, left + 11, v1);
        }
    }

    private void desenhaFace(Graphics g, int top, int left, int valor) {
        g.setColor(255, 255, 0);
        g.fillRect(left, top, 11, 11);
        g.setColor(0, 0, 0);
        g.drawRect(left, top, 11, 11);
        switch (valor) {
            case 1:
                g.drawRect(left + 5, top + 5, 1, 1);
                break;
            case 2:
                g.drawRect(left + 2, top + 8, 1, 1);
                g.drawRect(left + 8, top + 2, 1, 1);
                break;
            case 3:
                g.drawRect(left + 2, top + 8, 1, 1);
                g.drawRect(left + 5, top + 5, 1, 1);
                g.drawRect(left + 8, top + 2, 1, 1);
                break;
            case 4:
                g.drawRect(left + 2, top + 2, 1, 1);
                g.drawRect(left + 2, top + 8, 1, 1);
                g.drawRect(left + 8, top + 2, 1, 1);
                g.drawRect(left + 8, top + 8, 1, 1);
                break;
            case 5:
                g.drawRect(left + 2, top + 2, 1, 1);
                g.drawRect(left + 2, top + 8, 1, 1);
                g.drawRect(left + 5, top + 5, 1, 1);
                g.drawRect(left + 8, top + 2, 1, 1);
                g.drawRect(left + 8, top + 8, 1, 1);
                break;
            case 6:
                g.drawRect(left + 2, top + 2, 1, 1);
                g.drawRect(left + 2, top + 5, 1, 1);
                g.drawRect(left + 2, top + 8, 1, 1);
                g.drawRect(left + 8, top + 2, 1, 1);
                g.drawRect(left + 8, top + 5, 1, 1);
                g.drawRect(left + 8, top + 8, 1, 1);
                break;
        }
    }
}
